home *** CD-ROM | disk | FTP | other *** search
- /******************************************************************************
- *
- * NSSDC/CDF Calculate statistics.
- *
- * Version 2.0, 20-Feb-92, ST Systems (STX)
- *
- * Modification history:
- *
- * V1.0 29-Aug-91, J Love Original version (for CDF V2.1).
- * V2.0 20-Feb-92, J Love IBM PC port. Added fill value filtering.
- *
- ******************************************************************************/
-
- #include <stdlib.h>
- #include <stdio.h>
-
- #include "cdfdist.h"
- #include "cdfstats.h"
-
- /******************************************************************************
- * MinMaxInit.
- ******************************************************************************/
-
- void MinMaxInit () {
- void *_value_;
- Boolean _use_;
-
- if (hyper)
- _value_ = (Byte *) buffer + (numElemsV * ElemSize(dataTypeV) * valueN);
- else
- _value_ = (Byte *) buffer;
-
- if (filterFillsVar)
- if (NE(_value_,fillval))
- _use_ = TRUE;
- else {
- _use_ = FALSE;
- fills++;
- }
- else
- _use_ = TRUE;
-
- if (_use_) {
- ASSIGN (min, _value_);
- ASSIGN (max, _value_);
- if (rangeCheckVar) {
- if (LT(_value_,validmin))
- low++;
- else
- if (GT(_value_,validmax))
- high++;
- else {
- oneINrange = TRUE;
- ASSIGN (minINrange, _value_);
- ASSIGN (maxINrange, _value_);
- }
- }
- minmaxInited = TRUE;
- }
- return;
- }
-
- void MinMaxCheck () {
- void *_value_;
- Boolean _use_;
-
- if (hyper)
- _value_ = (Byte *) buffer + (ElemSize(dataTypeV) * numElemsV * valueN);
- else
- _value_ = (Byte *) buffer;
-
- if (filterFillsVar)
- if (NE(_value_,fillval))
- _use_ = TRUE;
- else {
- _use_ = FALSE;
- fills++;
- }
- else
- _use_ = TRUE;
-
- if (_use_) {
- if (LT(_value_,min))
- ASSIGN (min, _value_);
- else
- if (GT(_value_,max))
- ASSIGN (max, _value_);
- if (rangeCheckVar) {
- if (LT(_value_,validmin))
- low++;
- else
- if (GT(_value_,validmax))
- high++;
- else
- if (oneINrange) {
- if (LT(_value_,minINrange))
- ASSIGN (minINrange, _value_);
- else
- if (GT(_value_,maxINrange))
- ASSIGN (maxINrange, _value_);
- }
- else {
- oneINrange = TRUE;
- ASSIGN (minINrange, _value_);
- ASSIGN (maxINrange, _value_);
- }
- }
- }
- return;
- }
-
- /******************************************************************************
- * Monotonic.
- ******************************************************************************/
-
- void Monotonic () {
- void *_value_;
- Boolean _use_;
-
- if (hyper)
- _value_ = (Byte *) buffer + (numElemsV * ElemSize(dataTypeV) * valueN);
- else
- _value_ = (Byte *) buffer;
-
- if (filterFillsVar)
- if (NE(_value_,fillval))
- _use_ = TRUE;
- else
- _use_ = FALSE;
- else
- _use_ = TRUE;
-
- if (_use_)
- if ( ! monoInited) {
- ASSIGN (last, _value_);
- state = _Init;
- monoInited = TRUE;
- }
- else {
- switch (state) {
- case _Init:
- if (EQ(_value_,last)) {
- state = _Steady;
- break;
- }
- if (LT(_value_,last)) {
- state = _Decrease;
- break;
- }
- if (GT(_value_,last)) {
- state = _Increase;
- break;
- }
- break;
- case _Steady:
- if (LT(_value_,last)) {
- state = _noIncrease;
- break;
- }
- if (GT(_value_,last)) {
- state = _noDecrease;
- break;
- }
- break;
- case _Increase:
- if (LT(_value_,last)) {
- state = _False;
- break;
- }
- if (EQ(_value_,last)) {
- state = _noDecrease;
- break;
- }
- break;
- case _Decrease:
- if (GT(_value_,last)) {
- state = _False;
- break;
- }
- if (EQ(_value_,last)) {
- state = _noIncrease;
- break;
- }
- break;
- case _noIncrease:
- if (GT(_value_,last)) {
- state = _False;
- break;
- }
- break;
- case _noDecrease:
- if (LT(_value_,last)) {
- state = _False;
- break;
- }
- }
- ASSIGN (last, _value_);
- }
- }
-
- /******************************************************************************
- * Reads each record of a variable and calculates the statistics.
- ******************************************************************************/
-
- void CALCstat (maxRec, NrecValues)
- long maxRec;
- long NrecValues;
- {
- long recN;
- CDFstatus status;
- char monotonic[80+1];
- long nBytes;
- static long indices[CDF_MAX_DIMS] = {0,0,0,0,0,0,0,0,0,0};
-
- /******************************************************************************
- * Initialize for this variable.
- ******************************************************************************/
-
- low = 0;
- high = 0;
- fills = 0;
- oneINrange = FALSE;
- minmaxInited = FALSE;
- monoInited = FALSE;
-
- /******************************************************************************
- * Allocate memory.
- ******************************************************************************/
-
- nBytes = ElemSize(dataTypeV) * numElemsV * NrecValues;
-
- #if defined(__MSDOS__)
- if (nBytes > (long) 65535) {
- hyper = FALSE;
- MALLOC (buffer, ElemSize(dataTypeV) * numElemsV);
- }
- else {
- #endif
- buffer = (void *) malloc (nBytes);
- if (buffer == NULL) { /* Not enough memory to use HyperGets - using SEQACC */
- hyper = FALSE;
- MALLOC (buffer, ElemSize(dataTypeV) * numElemsV);
- }
- else
- hyper = TRUE; /* Enough memory, use HyperGets. */
- #if defined(__MSDOS__)
- }
- #endif
-
- MALLOC (min, ElemSize(dataTypeV) * numElemsV);
- MALLOC (max, ElemSize(dataTypeV) * numElemsV);
- MALLOC (last, ElemSize(dataTypeV) * numElemsV);
-
- if (rangeCheckVar) {
- MALLOC (minINrange, ElemSize(dataTypeV) * numElemsV);
- MALLOC (maxINrange, ElemSize(dataTypeV) * numElemsV);
- }
-
- if ( ! hyper) {
- status = CDFlib (SELECT_, CDF_, id,
- VAR_SEQPOS_, (long) 0, indices,
- NULL_);
- CHECKstatus (status);
- }
-
- /******************************************************************************
- * Read each record...
- ******************************************************************************/
-
- for (recN = 0; recN <= maxRec; recN++) {
- if (hyper) {
- status = CDFlib (SELECT_, CDF_, id,
- CDF_RECNUMBER_, recN,
- GET_, VAR_HYPERDATA_, buffer,
- NULL_);
- CHECKstatus (status);
- }
-
- /***************************************************************************
- * ...and calculate min/max and monotonicity for each value in each record.
- ***************************************************************************/
-
- for (valueN = 0; valueN < NrecValues; valueN++) {
- if ( ! hyper) {
- status = CDFlib (SELECT_, CDF_, id,
- GET_, VAR_SEQDATA_, buffer,
- NULL_);
- CHECKstatus (status);
- }
-
- if (minmaxInited)
- MinMaxCheck ();
- else
- MinMaxInit ();
-
- if (checkMonotonicVar) Monotonic ();
- }
- }
-
- /**********************************************************************
- * display statistics
- **********************************************************************/
-
- if (checkMonotonicVar)
- if (monoInited)
- switch (state) {
- case _Init:
- strcpy (monotonic, "Steady (one value)");
- break;
- case _Steady:
- strcpy (monotonic, "Steady (all values the same)");
- break;
- case _Increase:
- strcpy (monotonic, "Increase");
- break;
- case _Decrease:
- strcpy (monotonic, "Decrease");
- break;
- case _noIncrease:
- strcpy (monotonic, "noIncrease (some values the same)");
- break;
- case _noDecrease:
- strcpy (monotonic, "noDecrease (some values the same)");
- break;
- case _False:
- strcpy (monotonic, "False");
- break;
- }
- else
- strcpy (monotonic, "n/a (all fill values)");
- else
- strcpy (monotonic, "n/a");
-
- DISPstat (monotonic);
-
- /******************************************************************************
- * Free memory used.
- ******************************************************************************/
-
- free (buffer);
- free (min);
- free (max);
- free (last);
-
- if (rangeCheckVar) {
- free (minINrange);
- free (maxINrange);
- }
-
- return;
- }
-
- /******************************************************************************
- * ASSIGN.
- ******************************************************************************/
-
- void ASSIGN (dst, src)
- void *dst;
- void *src;
- {
- memmove (dst, src, numElemsV * ElemSize(dataTypeV));
- return;
- }
-
- /******************************************************************************
- * EQ.
- ******************************************************************************/
-
- Boolean EQ (a, b)
- void *a;
- void *b;
- {
- return (memcmp(a, b, numElemsV * ElemSize(dataTypeV)) == 0 ? TRUE : FALSE);
- }
-
- /******************************************************************************
- * NE.
- ******************************************************************************/
-
- Boolean NE (a, b)
- void *a;
- void *b;
- {
- return (memcmp(a, b, numElemsV * ElemSize(dataTypeV)) == 0 ? FALSE : TRUE);
- }
-
- /******************************************************************************
- * LT.
- ******************************************************************************/
-
- Boolean LT (a, b)
- void *a;
- void *b;
- {
- switch (dataTypeV) {
- case CDF_BYTE:
- case CDF_INT1:
- return (*((Schar *) a) < *((Schar *) b));
- case CDF_UINT1:
- return (*((Uchar *) a) < *((Uchar *) b));
- case CDF_INT2:
- return (*((short *) a) < *((short *) b));
- case CDF_UINT2:
- return (*((unsigned short *) a) < *((unsigned short *) b));
- case CDF_INT4:
- return (*((long *) a) < *((long *) b));
- case CDF_UINT4:
- return (*((unsigned long *) a) < *((unsigned long *) b));
- case CDF_REAL4:
- case CDF_FLOAT:
- return (*((float *) a) < *((float *) b));
- case CDF_REAL8:
- case CDF_DOUBLE:
- case CDF_EPOCH:
- return (*((double *) a) < *((double *) b));
- case CDF_CHAR:
- case CDF_UCHAR:
- return (memcmp(a,b,numElemsV) < 0 ? TRUE : FALSE);
- }
- return FALSE;
- }
-
- /******************************************************************************
- * GT.
- ******************************************************************************/
-
- Boolean GT (a, b)
- void *a;
- void *b;
- {
- switch (dataTypeV) {
- case CDF_BYTE:
- case CDF_INT1:
- return (*((Schar *) a) > *((Schar *) b));
- case CDF_UINT1:
- return (*((Uchar *) a) > *((Uchar *) b));
- case CDF_INT2:
- return (*((short *) a) > *((short *) b));
- case CDF_UINT2:
- return (*((unsigned short *) a) > *((unsigned short *) b));
- case CDF_INT4:
- return (*((long *) a) > *((long *) b));
- case CDF_UINT4:
- return (*((unsigned long *) a) > *((unsigned long *) b));
- case CDF_REAL4:
- case CDF_FLOAT:
- return (*((float *) a) > *((float *) b));
- case CDF_REAL8:
- case CDF_DOUBLE:
- case CDF_EPOCH:
- return (*((double *) a) > *((double *) b));
- case CDF_CHAR:
- case CDF_UCHAR:
- return (memcmp(a,b,numElemsV) > 0 ? TRUE : FALSE);
- }
- return FALSE;
- }
-